from django.db import models

class UserInfo(models.Model):
    username = models.CharField(verbose_name="用户名",max_length=32,db_index=True) # db_index 创建索引
    email = models.EmailField(verbose_name="邮箱",max_length=32)
    password = models.CharField(verbose_name="密码",max_length=32)
    mobile_phone = models.CharField(verbose_name="手机号",max_length=15)

    # 用户表中加入价格策略可以提升数据库查询效率
    # price_policy = models.ForeignKey(verbose_name='价格策略', to='PricePolicy', null=True, blank=True)
    def __str__(self):
        return self.username
    

class PricePolicy(models.Model):
    """价格策略"""
    catergory_choices = (
        (1,'免费版'),
        (2,'收费版'),
        (3,'其它')
    )
    catergory = models.SmallIntegerField(verbose_name='收费类型',default=2,choices=catergory_choices)

    title = models.CharField(verbose_name='标题',max_length=32)
    # PositiveIntegerField正整数或0类型，取值范围为[0 ,2147483647]
    price = models.PositiveIntegerField(verbose_name='价格')

    project_num = models.PositiveIntegerField(verbose_name="项目个数")
    project_member = models.PositiveIntegerField(verbose_name="项目成员")
    project_space = models.PositiveIntegerField(verbose_name="项目空间",help_text='G')
    per_file_size = models.PositiveIntegerField(verbose_name='单文件大小(M)',help_text='M')

    create_datetime = models.DateTimeField(verbose_name='创建时间',auto_now_add=True)

class Transaction(models.Model):
    """交易记录表"""
    status_choices = (
        (1,'未支付'),
        (2,'已支付')
    )
    status = models.SmallIntegerField(verbose_name='支付状态',choices=status_choices)
    order = models.CharField(verbose_name='订单编号',max_length=64,unique=True)
    user = models.ForeignKey(verbose_name='用户',to='UserInfo',on_delete=models.CASCADE)
    price_policy = models.ForeignKey(verbose_name='价格策略',to='PricePolicy',on_delete=models.CASCADE)
    count = models.PositiveIntegerField(verbose_name='数量(年)',help_text='0表示无限期')
    price = models.PositiveIntegerField(verbose_name='实际支付价格')

    start_datetime = models.DateTimeField(verbose_name='开始时间',null=True,blank=True)
    end_datetime = models.DateTimeField(verbose_name='结束时间',null=True,blank=True)

    create_datetime = models.DateTimeField(verbose_name='创建时间',auto_now_add=True)

class Project(models.Model):
    """项目表"""
    COLOR_CHIOCES = (
        (1, "#56b8eb"),  # 56b8eb
        (2, "#f28033"),  # f28033
        (3, "#ebc656"),  # ebc656
        (4, "#a2d148"),  # a2d148
        (5, "#20BFA4"),  # #20BFA4
        (6, "#7461c2"),  # 7461c2,
        (7, "#20bfa3"),  # 20bfa3,
    )
    color = models.SmallIntegerField(verbose_name='颜色',choices=COLOR_CHIOCES,default=1)
    name = models.CharField(verbose_name='项目名',max_length=32)
    desc = models.CharField(verbose_name='项目描述',max_length=255,null=True,blank=True)
    star = models.BooleanField(verbose_name='星标',default=False)
    use_space = models.PositiveIntegerField(verbose_name='项目已使用空间',default=0)
    
    join_count = models.SmallIntegerField(verbose_name='参与人数',default=1)
    creator = models.ForeignKey(verbose_name='创建者',to='UserInfo',on_delete=models.CASCADE)
   
    
    create_datetime = models.DateTimeField(verbose_name='创建时间',auto_now_add=True)

    # cos桶
    bucket = models.CharField(verbose_name='cos桶',max_length=128)
    region = models.CharField(verbose_name='cos区域',max_length=32)

class ProjectUser(models.Model):
    """ 项目参与者 """
    project = models.ForeignKey(verbose_name='项目', to='Project',on_delete=models.CASCADE)
    user = models.ForeignKey(verbose_name='参与者', to='UserInfo',on_delete=models.CASCADE)
    star = models.BooleanField(verbose_name='星标', default=False)

    # 如果一个表中的两个字段同时关联另一张表可以利用 related_name='a'属性用于区别两个关联字段
    # intter = models.ForeignKey(verbose_name='邀请者',to='UserInfo',related_name='a')
    create_datetime = models.DateTimeField(verbose_name='加入时间', auto_now_add=True)

class Wiki(models.Model):
    title = models.CharField(verbose_name='标题',max_length=32)
    project = models.ForeignKey(verbose_name='项目', to='Project',on_delete=models.CASCADE)
    content = models.TextField(verbose_name='文章内容')

    depth = models.IntegerField(verbose_name='深度',default=1)
    # 自关联,to='self'
    parent = models.ForeignKey(verbose_name='父文章',to='self',on_delete=models.CASCADE,null=True,blank=True,related_name='children')

    def __str__(self):
        return self.title
    
class FileRepository(models.Model):
    """ 文件库 """
    project = models.ForeignKey(verbose_name='项目', to='Project',on_delete=models.CASCADE)
    file_type_choices = (
        (1, '文件'),
        (2, '文件夹')
    )
    file_type = models.SmallIntegerField(verbose_name='类型', choices=file_type_choices)
    name = models.CharField(verbose_name='文件夹名称', max_length=32, help_text="文件/文件夹名")
    key = models.CharField(verbose_name='文件储存在COS中的KEY', max_length=128, null=True, blank=True)

    # int类型最大表示的数据
    file_size = models.BigIntegerField(verbose_name='文件大小', null=True, blank=True, help_text='字节')

    file_path = models.CharField(verbose_name='文件路径', max_length=255, null=True,
                                 blank=True)  # https://桶.cos.ap-chengdu/....

    parent = models.ForeignKey(verbose_name='父级目录', to='self',on_delete=models.CASCADE, related_name='child', null=True, blank=True)

    update_user = models.ForeignKey(verbose_name='最近更新者', to='UserInfo',on_delete=models.CASCADE)
    update_datetime = models.DateTimeField(verbose_name='更新时间', auto_now=True)

class Module(models.Model):
    """模块（里程碑）"""
    project = models.ForeignKey(verbose_name='项目',to='Project',on_delete=models.CASCADE)
    title = models.CharField(verbose_name='模块名称',max_length=32)

    def __str__(self):
        return self.title

class IssuesType(models.Model):
    """问题类型"""
   
    PROJECT_INIT_LIST = ['任务','功能','Bug']

    title = models.CharField(verbose_name='类型名称',max_length=32)
    # color = models.SmallIntegerField(verbose_name='颜色',choices=PROJECT_INIT_LIST,default=1)
    project = models.ForeignKey(verbose_name='项目',to='Project',on_delete=models.CASCADE)

    def __str__(self):
        return self.title
    
class Issues(models.Model):
    """ 问题 """
    project = models.ForeignKey(verbose_name='项目', to='Project',on_delete=models.CASCADE)
    issues_type = models.ForeignKey(verbose_name='问题类型', to='IssuesType',on_delete=models.CASCADE)
    module = models.ForeignKey(verbose_name='模块', to='Module', null=True, blank=True,on_delete=models.CASCADE)

    subject = models.CharField(verbose_name='主题', max_length=80)
    desc = models.TextField(verbose_name='问题描述')
    priority_choices = (
        ("danger", "高"),
        ("warning", "中"),
        ("success", "低"),
    )
    priority = models.CharField(verbose_name='优先级', max_length=12, choices=priority_choices, default='danger')

    # 新建、处理中、已解决、已忽略、待反馈、已关闭、重新打开
    status_choices = (
        (1, '新建'),
        (2, '处理中'),
        (3, '已解决'),
        (4, '已忽略'),
        (5, '待反馈'),
        (6, '已关闭'),
        (7, '重新打开'),
    )
    status = models.SmallIntegerField(verbose_name='状态', choices=status_choices, default=1)

    assign = models.ForeignKey(verbose_name='指派', to='UserInfo', related_name='task', null=True, blank=True,on_delete=models.CASCADE)
    attention = models.ManyToManyField(verbose_name='关注者', to='UserInfo', related_name='observe', blank=True)

    start_date = models.DateField(verbose_name='开始时间', null=True, blank=True)
    end_date = models.DateField(verbose_name='结束时间', null=True, blank=True)
    mode_choices = (
        (1, '公开模式'),
        (2, '隐私模式'),
    )
    mode = models.SmallIntegerField(verbose_name='模式', choices=mode_choices, default=1)

    parent = models.ForeignKey(verbose_name='父问题', to='self', related_name='child', null=True, blank=True,
                               on_delete=models.SET_NULL)

    creator = models.ForeignKey(verbose_name='创建者', to='UserInfo', related_name='create_problems',on_delete=models.CASCADE)

    create_datetime = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)
    latest_update_datetime = models.DateTimeField(verbose_name='最后更新时间', auto_now=True)

    def __str__(self):
        return self.subject



    